<?php
/**
 * 配置文件
 */
try {
    (new Dotenv\Dotenv(__DIR__.'/../', '.server.env'))->overload();
} catch (Dotenv\Exception\InvalidPathException $e) {
    try {
        (new Dotenv\Dotenv(__DIR__.'/../', '.local.env'))->overload();
    } catch (Dotenv\Exception\InvalidPathException $e) {}
}

/**
 * 开启 Eloquent 支持
 */
$app->withEloquent();

/**
 * 开启 Facades 支持
 */
$app->withFacades(true, [
    Tymon\JWTAuth\Facades\JWTAuth::class    => 'JWTAuth',
    Tymon\JWTAuth\Facades\JWTFactory::class => 'JWTFactory',
]);

/**
 * 注册全局中间件
 */
$app->middleware([
    Barryvdh\Cors\HandleCors::class, // 解决跨域问题
    Api\LanguageMiddleware::class,        // 解决语言包问题
    // Api\CloseMiddleware::class,   // 打开注释即关站
]);

/**
 * 注册路由中间件
 */
// $app->routeMiddleware([
// ]);

/**
 * 使默认认证无效化
 */
Auth::viaRequest('api', function () {});

/**
 * 基础 IoC 绑定：控制台核心
 */
$app->singleton(
    Illuminate\Contracts\Console\Kernel::class,
    Api\ConsoleKernel::class
);

/**
 * 基础 IoC 绑定：路由登记员
 */
$app->singleton(Api\RouteRegistrar::class, function ()
{
    $routeRegistrar = new Api\RouteRegistrar;

    // 注册路由组：memberManager, memberManagerAuth
    $routeRegistrar->group('memberManager', '/member-manager');
    // 注册路由组：member, memberAuth
    $routeRegistrar->group('member', '/member');

    return $routeRegistrar;
});

/**
 * 日志查看
 */
$app->register(Rap2hpoutre\LaravelLogViewer\LaravelLogViewerServiceProvider::class);

/**
 * 注册核心服务提供者
 */
$app->register(Dingo\Api\Provider\LumenServiceProvider::class);
$app->singleton('api.exception', function ($app) {
    return new Api\ExceptionHandler($app['Illuminate\Contracts\Debug\ExceptionHandler']);
});
$app->register(Barryvdh\Cors\ServiceProvider::class); // 解决跨域问题
$app->register(Tymon\JWTAuth\Providers\LumenServiceProvider::class);
$app->register(Api\Sms\ZhuTong\ServiceProvider::class);
$app->register(Api\Captcha\Yangbx\ServiceProvider::class);

$app->register(Api\Member\AuthManager\ServiceProvider::class);

/**
 * 注册业务服务提供者
 */
$app->register(Api\Member\AccessLog\ServiceProvider::class);
$app->register(Api\Member\ApiPass\ServiceProvider::class);




/**
 * 全局异常处理
 */
app('Dingo\Api\Exception\Handler')
    ->register(function (PDOException $e) { error('sql_fail', 'sql fail '.$e->getCode()); });
app('Dingo\Api\Exception\Handler')
    ->register(function (Illuminate\Database\Eloquent\ModelNotFoundException $e) { error('not_found'); });


// 针对 mySql 的 utf8mb4 字符编码的字符串默认长度 767 bytes 的限制问题做设置
// 确保 artisan migrate 命令能够执行成功
Schema::defaultStringLength(191);
